---
title: Create/insert a task
summary: Initialize a new task instance and persist it via the pk82036_task.task_insert stored procedure.
status: draft
owner: SAIF Documentation
last_reviewed: 2026-08-21
library: SAIF.Business.Tasks
reference_type: embedded
operation_id: OP-2
trigger: Application creates a concrete task and calls Save()
---

# Createinsert a task

This operation initializes a new concrete task instance with default values, runs the common validation rules, and persists it via the `pk82036_task.task_insert` stored procedure.

| Field | Value |
| --- | --- |
| **Operation ID** | OP-2 |
| **Trigger** | Application creates a concrete task and calls `Save()` |
| **Inputs** | New `clsTask` instance (concrete subclass) |
| **Outputs** | Inserted `TASK` row; `TaskSeqNum` assigned by the procedure |
| **Primary components** | `clsTask.Create`, `clsTask.BeforeInsert`, `clsTask.AfterInsert` |
| **Entry point** | `SAIF.Business.Tasks/clsTask.vb` |

## Steps

1. `Create()` initializes text/source/category/action to empty, sets `NotepadFlag` and `DeleteFlag` to `N` ([BR-015](../business-rules.md#br-015-new-tasks-start-not-completed-and-without-a-notepad-entry)), sets `CreateUser` from `MyCriteria.CreateUser` or, when blank, from `MyCriteria.DataPortalInfo.UserID` ([BR-014](../business-rules.md#br-014-creating-user-defaults-to-the-data-portal-user-identity)), copies it into `UpdateUser`, stamps `CreateDate`/`UpdateDate` = `Now`, and marks the smart-type fields as original.
2. Property setters mark the object dirty:
   - `MailID` setter uppercases/trims the value and fires `CheckRules("TaskUser")` ([BR-016](../business-rules.md#br-016-mailids-are-stored-and-compared-trimmed-and-upper-cased)).
   - `TaskDate` setter routes through `AssignTaskDate` (see [Assign and normalize a task due date](assign-normalize-task-due-date.md)).
   - `Text` setter coerces `Nothing` to `String.Empty` ([BR-027](../business-rules.md#br-027-task-text-is-never-null)).
3. On save, the framework runs the rules registered in `AddBusinessRules`:
   - Category, source, priority, and MailID required ([BR-001](../business-rules.md#br-001-a-task-must-have-a-task-category-code), [BR-002](../business-rules.md#br-002-a-task-must-have-a-source-system-code), [BR-003](../business-rules.md#br-003-a-task-must-have-a-priority-code), [BR-004](../business-rules.md#br-004-a-task-must-be-assigned-to-a-mailid)).
   - `ValidSourceCategory` checks the source/category combination against `TASK_CATEGORY_CODE` ([BR-005](../business-rules.md#br-005-the-task-source-code-task-category-code-combination-must-exist), [SQL-005](../sql/SQL-005-valid-source-category-check.md), [TASK_CATEGORY_CODE](../database-tables.md#task_category_code)).
   - `CheckDate` validates a current-or-future date unless the task is batch-created ([BR-006](../business-rules.md#br-006-a-task-must-carry-a-current-or-future-date), [BR-007](../business-rules.md#br-007-batch-created-tasks-bypass-the-currentfuture-date-rule)).
   - `CheckDateModified` raises a non-blocking warning if the date was auto-shifted ([BR-008](../business-rules.md#br-008-automatic-due-date-shifting-must-be-surfaced-as-a-warning)).
   - A failing rule blocks persistence unless the descendant's `OverrideRules` converts it to a pass ([BR-026](../business-rules.md#br-026-descendant-task-types-may-override-common-rule-outcomes)).
   - On failure: the save is blocked and the object carries the rule's error message.
4. `BeforeInsert` builds a `NonQuery` `StoredProcedure` request (`DataRequest.ID = "INSERT"`) against `pk82036_task.task_insert` and adds 21 input parameters — create/update user, delete & notepad flags, task user (MailID), action/category/priority/source codes, date, text (4000), policy number, claim ID, image sequence number, task security, and the six context values — plus `RowsAffected` as a `ReturnValue` ([SQL-001](../sql/SQL-001-insert-task.md), [TASK](../database-tables.md#task)).
   > **Origin**: The `task_insert` procedure body resides in the Oracle database and was not retrieved in this analysis pass — its internal logic (e.g., `TASK_SEQ_NUM` assignment) is unverified.**
5. Framework executes the request against the DPI.
6. `AfterInsert` reads `RowsAffected`:
   - If `<> 1`: `AddErrorMessage("InsertError", "Task Insert Failed")` ([BR-010](../business-rules.md#br-010-task-insert-must-affect-exactly-one-row)).
   - Otherwise: removes the message and calls `MarkOld()`.

## Process flow

The following diagram visualizes this operation's control flow.

```mermaid
flowchart TD
	Start([Save called on new task]) --> S1[Create initializes defaults]
	S1 --> S2[Property setters mark dirty]
	S2 --> D{Business rules pass?}
	D -->|No| ErrEnd([Save blocked, error surfaced])
	D -->|Yes| S3["BeforeInsert builds<br>task_insert request"]
	S3 --> S4[Framework executes request]
	S4 --> D2{RowsAffected = 1?}
	D2 -->|No| ErrEnd2(["InsertError: Task Insert<br>Failed"])
	D2 -->|Yes| EndOk([MarkOld — task persisted])
```

## Failure and edge-case behavior

- Any registered rule failure blocks the save unless overridden by the descendant ([BR-026](../business-rules.md#br-026-descendant-task-types-may-override-common-rule-outcomes)).
- `RowsAffected <> 1` after insert surfaces `InsertError` = "Task Insert Failed" rather than throwing ([BR-010](../business-rules.md#br-010-task-insert-must-affect-exactly-one-row)).
- The `TaskCategoryCode` `TextRequired` rule appears to be registered twice in `AddBusinessRules`; whether this produces a duplicate error message depends on framework rule de-duplication behavior**.

## Related documentation
- [Operations and processes](../operations-processes.md)
- [Business rules](../business-rules.md)
- [SQL catalog](../sql/index.md)
- [Database tables](../database-tables.md)

> **Note:** Statements marked with * were inferred from code structure, naming conventions, or
> contextual evidence where direct confirmation was not available in source artifacts. Statements
> marked with ** could not be confirmed; treat as unknown until verified.

## Sources
- SAIF.Business.Tasks/clsTask.vb
